﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using Tes;
using TES.EnteRegulador;
using TesGestion.AccesoDatos;
using Microsoft.Practices.EnterpriseLibrary.Data;
using Wintellect.PowerCollections;
using System.IO;
using AjaxControlToolkit;

namespace TES.WEB.EnteRegulador.Controles
{
    public partial class ControlLegalizacionesVigentes : System.Web.UI.UserControl
    {
        /// <summary>
        /// Evento para indicar que el PDF se debe descargar
        /// </summary>
        public event EventHandler PrintPdf;

        /// <summary>
        /// Evento disparado al exportar un pdf en el Data Grid View. Esto se realiza para avisar a la página contenedora que se  debe imprimir un pdf
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnPrintPdf(object sender, EventArgs e)
        {
            if (PrintPdf != null)
            {
                PrintPdf(sender, e);
            }
        }

        private const string _ascending = "ASC";
        private const string _descending = "DESC";
        protected void Page_Load(object sender, EventArgs e)
        {
            //btnAceptarRadicacion.OnClientClick = String.Format("functionPostback('{0}','{1}')", btnAceptarRadicacion.UniqueID, "");
        }

        public SortDirection GridViewSortDirection
        {
            get
            {
                if (ViewState["DirectionLeg"] == null)
                    ViewState["DirectionLeg"] = SortDirection.Ascending;

                return (SortDirection)ViewState["DirectionLeg"];
            }
            set { ViewState["DirectionLeg"] = value; }
        }

        protected void OnSortLegalizaciones(object sender, GridViewSortEventArgs e)
        {
            string sortExpression = e.SortExpression;

            if (GridViewSortDirection == SortDirection.Ascending)
            {
                GridViewSortDirection = SortDirection.Descending;


                //    SortGridView(sortExpression, _descending);
                Session["DirectionLeg"] = _descending;
            }
            else
            {
                GridViewSortDirection = SortDirection.Ascending;
                //SortGridView(sortExpression, _ascending);
                Session["DirectionLeg"] = _ascending;
            }
            Session["SortExpressionLeg"] = sortExpression;
            //   ObjectDataSource1.DataBind();
            GridViewControlLegalizacionesVigentes.DataBind();
            e.Cancel = true;


        }

        protected void btnFiltrarLegalizaciones_Click(object sender, EventArgs e)
        {
            if (_checkBoxFiltrarPorCodigo.Checked == true)
            {
                Session["FiltrarCodigo"] = txtFiltrarCodigo.Text.ToString();
            }
            else
            {
                Session["FiltrarCodigo"] = null;
            }

            if (_checkBoxFiltrarPorEstado.Checked == true)
            {
                Session["FiltrarEstado"] = txtFiltrarEstado.Text.ToString();
            }
            else
            {
                Session["FiltrarEstado"] = string.Empty;
            }
        }

        protected void GridViewControlLegalizacionesVigentes_RowDataBound(object sender, GridViewRowEventArgs e)
        {

        }

        protected bool Radicar(object completo)
        {
            if (completo.ToString().Length > 0)
                return false;
            else
                return true;
            //if ((int)completo < 0)
            //    return true;
            //else
            //    return false;
        }

        protected void GridViewControlLegalizacionesVigentes_SelectedIndexChanging(object sender, GridViewSelectEventArgs e)
        {
            FormViewContenido.PageIndex = e.NewSelectedIndex;
        }

        protected void GridViewControlLegalizacionesVigentes_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName == "RadicarLegalizacion")
            {
                int i = (int.Parse(e.CommandArgument.ToString()));
            }


            if (e.CommandName == "DetallesLegalizacion")
            {
                AjaxControlToolkit.ModalPopupExtender mpe = FindControlRecursive(this.Page, IdPopUp) as ModalPopupExtender;
                ControlDetallesLegalizacionEnlace cde = FindControlRecursive(this.Page, IdControlDetalles) as ControlDetallesLegalizacionEnlace;
                int index = 0;
                if (int.TryParse(e.CommandArgument.ToString(), out index) && cde != null)
                {
                    Guid idLegalizacion = new Guid(((GridView)(sender)).DataKeys[index].Value.ToString());
                    cde.IdLegalizacion = idLegalizacion.ToString();
                    cde.DataBind();
                }

                //regActual.MergeRed.ListaMerges

                mpe.Show();

             


            }
        }

        protected void _radicarLegalizacion_Click(object sender, ImageClickEventArgs e)
        {
            string prueba;

            ImageButton btntest = sender as ImageButton;
            GridViewRow row = (GridViewRow)btntest.NamingContainer;
            GridViewControlLegalizacionesVigentes.EditIndex = row.RowIndex;
            prueba = row.Cells[1].Text;
            ModalPopupExtenderRadicacion.Show();


        }
        /// <summary>
        /// Finds a control by recursively searching containing controls
        /// </summary>
        /// <param name="root">Top-level control that contains controls</param>
        /// <param name="id">ID of the control to find</param>
        /// <returns>Control matching the ID</returns>
        public static Control FindControlRecursive(Control root, string id)
        {
            if (root.ID == id)
            {
                return root;
            }

            foreach (Control c in root.Controls)
            {
                Control t = FindControlRecursive(c, id);
                if (t != null)
                {
                    return t;
                }
            }

            return null;
        }

        protected void btnAceptarRadicacion_Click(object sender, EventArgs e)
        {
            TextBox textRadicacion = FindControlRecursive(GridViewControlLegalizacionesVigentes.Rows[GridViewControlLegalizacionesVigentes.EditIndex], "TextBoxNumeroRadicacionGrid") as TextBox;
            textRadicacion.Text = txtNumeroRadicacion.Text;
            TextBox textFecha = FindControlRecursive(GridViewControlLegalizacionesVigentes.Rows[GridViewControlLegalizacionesVigentes.EditIndex], "TextBoxFechaRadicacion") as TextBox;
            textFecha.Text = txtFechaRadicacion.Text;
            GridViewControlLegalizacionesVigentes.UpdateRow(GridViewControlLegalizacionesVigentes.EditIndex, false);
            ModalPopupExtenderRadicacion.Hide();

        }

        protected void ObjectDataSource3_Updated(object sender, ObjectDataSourceStatusEventArgs e)
        {

        }

        protected void ObjectDataSource3_Updating(object sender, ObjectDataSourceMethodEventArgs e)
        {


        }

        protected void GridViewControlLegalizacionesVigentes_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            if (e.NewValues["FechaRadicacion"] != null)
            {
                string fecha = e.NewValues["FechaRadicacion"].ToString();
                e.NewValues["FechaRadicacion"] = DateTime.Parse(fecha);
            }
        }

        protected void btnCancelarRadicacion_Click(object sender, EventArgs e)
        {
            GridViewControlLegalizacionesVigentes.UpdateRow(GridViewControlLegalizacionesVigentes.EditIndex, false);
            ModalPopupExtenderRadicacion.Hide();
        }

        protected void _insertarLegalizacion_Click(object sender, ImageClickEventArgs e)
        {
            FormViewContenido.ChangeMode(FormViewMode.Insert);

            //DropDownList dpl = FindControlRecursive(FormViewContenido, "dropDownListCodExp") as DropDownList;
            //Image imagen = FindControlRecursive(FormViewContenido, "imagenAdicionar") as Image;
            //imagen.Visible = true;
            _insertarLegalizacion.Visible = false;
            //_guardarLegalizacion.Visible = true;      
            //dpl.Visible = true;
            
        }

        /// <summary>
        /// Id del popup extender
        /// </summary>
        public string IdPopUp
        {
            get { return Session["IdPopUpLegalizaciones"].ToString(); }
            set { Session["IdPopUpLegalizaciones"] = value; }
        }
        /// <summary>
        /// Id del control que muestra los detalles del control
        /// </summary>
        public string IdControlDetalles
        {
            get { return Session["IdControlDetallesLegalizaciones"].ToString(); }
            set { Session["IdControlDetallesLegalizaciones"] = value; }
        }



        protected ResultadosConflictos InsertUpdateFila(DataRow currentRow)
        {
            // Obteniendo la fila actual seleccionada
            DataRow drvActual = currentRow;
            string procName = "";
            bool isInsert = false;

            // Verificando el estado de la fila actual (Si fue modificada o adicionada)
            if (drvActual.RowState == DataRowState.Modified)
            {
                procName = "formas_UpdateLegalizacionesVigentes";
            }
            else if (drvActual.RowState == DataRowState.Added)
            {
                procName = "formas_InsertLegalizacionesVigentes";
                isInsert = true;
            }
            else
            {
                System.Diagnostics.Debug.Assert(false, "Caso no esperado");
                return new ResultadosConflictos(drvActual, TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultadoConflicto.None);
            }
            return ModificarFila(drvActual, procName, isInsert);
        }



        internal virtual ResultadosConflictos ModificarFila(DataRow rowAGuardar, string procName, bool isInsert)
        {
            return ModificarFila(rowAGuardar, procName, isInsert, TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultadoConflicto.None);
        }

        private ResultadosConflictos ModificarFila(DataRow rowAGuardar, string procName, bool isInsert,
            TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultadoConflicto tipoConflicto)
        {
            Database db = DatabaseFactory.CreateDatabase();
            TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado resultado = EjecutarInsertUpdate(rowAGuardar, procName, isInsert, db);

            // Si hay conflictos de concurrencia...
            //if (resultado == TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Concurrencia)
            //{
            //    //**** Este código es inaccesible ya que el manejo de la concurrencia se hace a través de la captura de excepciones en
            //    //**** el AccesoDatosFormas
            //    return VerificarConcurrencia(rowAGuardar, procName, db);
            //}
            //else if (resultado == TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Invalido)
            //{
            //    return new ResultadosConflictos(rowAGuardar, TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultadoConflicto.Invalid);
            //}
            //else
            //{
            //    return new ResultadosConflictos(rowAGuardar, tipoConflicto);
            //}

            if (resultado == TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Invalido)
            {
                return new ResultadosConflictos(rowAGuardar, TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultadoConflicto.Invalid);
            }
            else
            {
                return new ResultadosConflictos(rowAGuardar, tipoConflicto);
            }
        }

        private TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado EjecutarInsertUpdate(DataRow rowAGuardar, string procName, bool isInsert, Database db)
        {
            if (!FilaAGuardarValida(rowAGuardar)) throw new InvalidOperationException("No puede insertar o modificar esta fila ya que contiene valores no validos");
            Pair<int, object> retorno = new Pair<int, object>();
            try
            {
                //    if (EsVersionable)
                //        retorno = InsertUpdateDiversidadFrecuencia(rowAGuardar, NombreEntidad, isInsert,
                //            UsuarioActual.Id, UsuarioActual.Nombre, TipoElemento, _cadenaDatosVersionados + NombreEntidad);
                //    else
                retorno = TesGestion.AccesoDatos.AccesoDatosMinisterio.InsertUpdateFila(rowAGuardar, "LegalizacionesVigentes", procName, isInsert);
            }
            catch (AccesoDatosException ex)
            {
                //MessageBox.Show(ex.Message);
                return TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Invalido;
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                return TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Invalido;
            }


            // Actualiza el stamp
            rowAGuardar["Stamp"] = retorno.Second;

            ////// HACK: Como existen columnas "calculadas" en algunas tablas se deberían traer la fila
            ////// de nuevo de la base de datos, pero se decidió en un principio no traerse toda la 
            ////// información de la fila pues los datos que cambian ya se saben, el único valor que 
            ////// se trae es el stamp. Para no cambiar esta funcionalidad pues puede llegar a ser un 
            ////// cambio fuerte en algo que ya esta funcionando, se va a implementar una funcion que 
            ////// permita a los controles hijos modificar localmente esas columnas "calculadas" 
            ////ActualizarColumnasCalculadas(rowAGuardar);
            return retorno.First > 0 ? TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Ninguno : TesGestion.AccesoDatos.AccesoDatosEnum.TipoResultado.Concurrencia;
        }

        private bool FilaAGuardarValida(DataRow rowAGuardar)
        {
            // Valida los datos básicos
            bool datosBasicosValidos = !Convert.IsDBNull(rowAGuardar["Id"]) &&
                     !Convert.IsDBNull(rowAGuardar["IdTipoEstado"]) &&
                     !Convert.IsDBNull(rowAGuardar["IdCreador"]) &&
                     !Convert.IsDBNull(rowAGuardar["fechaCreacion"]) &&
                     !Convert.IsDBNull(rowAGuardar["IdDatosEmpresa"]) &&
                     !Convert.IsDBNull(rowAGuardar["IdCodigoExpediente"]) &&
                     !Convert.IsDBNull(rowAGuardar["FoliosAnexos"]);

            // Si la Legalizacion esta en estado radicada hay que verificar el numero del ministerio
            bool datosRadicacionValidos = (TesGestion.AccesoDatos.AccesoDatosEnum.TiposEstadoLegalizacion)rowAGuardar["IdTipoEstado"] !=
                TesGestion.AccesoDatos.AccesoDatosEnum.TiposEstadoLegalizacion.Radicada || rowAGuardar["NumeroRadicacion"] != DBNull.Value;
            return datosBasicosValidos && datosRadicacionValidos;
        }

        protected void Imprimir_Click(object sender, ImageClickEventArgs e)
        {
            string usuario = Page.User.Identity.Name;
            Usuario userTes = AccesoDatosUsuario.ObtenerUsuarioModuloWebByLogin(usuario);



            ImageButton btntest = sender as ImageButton;
            GridViewRow row = (GridViewRow)btntest.NamingContainer;
            Guid idLegalizacion = new Guid(GridViewControlLegalizacionesVigentes.DataKeys[row.RowIndex].Value.ToString());
            string url = ImprimirFormatos(idLegalizacion);
            Session["UrlPDF"] = url;
            if (!string.IsNullOrEmpty(url))
            {

                Response.Clear();

                Response.ContentType = "application/pdf";

                string fileName = "FormatoLegalizacion.pdf";
                Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
                Response.WriteFile(url);
                Response.End();

            }
            UpdatePanelControlLegalizacionesVigentes.Update();
        //    OnPrintPdf(this, new EventArgs());
         
        }

       


        /// <summary>
        /// Manda a imprimir los formatos del ministerio
        /// </summary>
        protected virtual string ImprimirFormatos(Guid id)
        {
            return FormatosMinisterio.ImprimirFormatosLegalizacion(id);
        }

        public override void DataBind()
        {
            GridViewControlLegalizacionesVigentes.DataBind();
        }

        protected void Insert(object sender, FormViewInsertEventArgs e)
        {
            string usuario = Page.User.Identity.Name;
            Usuario userTes = AccesoDatosUsuario.ObtenerUsuarioModuloWebByLogin(usuario);
            e.Values.Add("IdCreador", userTes.Id.ToString());
            
            Session["IdUsuario"] = userTes.Id.ToString();
            
            FormViewContenido.ChangeMode(FormViewMode.ReadOnly);
            _insertarLegalizacion.Visible = true;
            //e.Cancel = true;
        }

        

        protected void CancelarLegalizacion_Click(object sender, ImageClickEventArgs e)
        {
            FormViewContenido.ChangeMode(FormViewMode.ReadOnly);
            _insertarLegalizacion.Visible = true;

        }

    }
}
